Docker Compose
In this lesson, we'll discuss Docker Compose.
Overview#
A typical microservice system contains more than a single Docker container. As explained in chapter 2, microservices are modules of a system.
It would be good to have a way to start and run several containers together for starting all the modules that the system consists of in one go. This can be done with Docker Compose.
Service discovery with Docker Compose links#
Coordinating a system of multiple Docker containers requires more than just starting multiple Docker containers. It also requires configurations for the virtual network with which the Docker containers communicate with each other. In particular, containers must be able to find each other in order to communicate.
In a Docker
Compose environment, a service can simply contact another service via
a Docker Compose link and then use the service name as the hostname.
So it could use a URL like http://order/
to contact the order
microservice.
Docker Compose links offer some kind of service discovery, that is, a way for microservices to find other microservices. Synchronous microservices require a form of service discovery.
Docker Compose links extend Docker links. Docker links only allow communication. Docker Compose links also implement load balancing and set the start order so that the dependent Docker containers start first.
Ports#
In addition, Docker Compose can bind ports from the containers to the ports of the Docker host where the Docker containers run.
Volumes#
Docker Compose can also provide volumes. These are file systems that can be shared by multiple containers. This allows containers to communicate by exchanging files.
YAML configuration#
Docker Compose configures the interaction of the Docker containers
with a YAML configuration file docker-compose.yml
.
The following file comes from a project which implements Edge Side Includes as a way to compose websites from different sources. For this purpose, three containers must be coordinated.
-
common
is a web application that is supposed to deliver common artifacts. -
order
is a web application for processing orders. -
varnish
is a web cache to coordinate the two web applications.
-
The first line defines the used version of Docker Compose – in this case three.
-
The second line starts the definition of the services.
-
Line three defines the service
common
. The directory specified in line four contains aDockerfile
with which the service can be built. An alternative tobuild
would beimage
to use a Docker image from a Docker registry. -
The definition of the service
order
also specifies a directory with aDockerfile
. No other settings are required for this service (lines 5/6). -
The service
varnish
is also defined by a directory with aDockerfile
(lines 7/8). -
The service
varnish
must have Docker Compose links to the servicescommon
andorder
. Therefore, it has entries underlinks
. Thevarnish
service can therefore reach the other services using the host namescommon
andorder
(lines 9-11). -
Finally, port 8080 of the service
varnish
is bound to port 8080 of the Docker host, on which Docker containers run (lines 12-13).
Additional options#
Further elements of the YAML configuration are described in the reference documentation. For example, Docker Compose supports volumes shared by multiple Docker containers. Docker Compose can also configure the Docker containers using environment variables.
Docker Compose live environment!#
You can try out Docker compose commands in the following environment. It consists of 3 Docker images running together. The final app should be available at the generated link such as https://x6jr4kg.educative.run
/
- docker-compose.yml
Docker Compose commands#
Docker Compose is controlled by the command line tool
docker-compose
. It must be started in the directory where the file
docker-compose.yml
is stored. The
reference documentation
lists all command line options for this tool. This lesson in the Appendix shows an overview of the Docker Compose
commands. The most important ones are:
-
docker-compose build
builds the images for the services. Try this command in the Docker compose coding environment above! -
With
docker-compose up
, all services are started. The command returns the combined standard output of all services. This is rarely helpful, sodocker-compose up -d
is often the better choice. In this case, the standard output is not returned. Try this command next! Notice all the services will be up and accessible at the given link. Withdocker-compose logs
the output of individual containers can be viewed. -
With
docker-compose up --scale <service>=<number>
, a larger number of containers for a service can be started. In the example from the listing,docker-compose up --scale common=2
could ensure that two containers for the servicecommon
are started. Try this next. -
docker-compose down
shuts down all services and deletes the containers. Try this to shut down all services.
Since the examples often require the interaction of several Docker
containers, most examples have a docker-compose.yml
file to run the
containers together.
Q U I Z
What is the purpose of Docker Compose?
A)
To start and run several containers together for starting all the modules that the system consists of in one go.
B)
To facilitate starting a single Docker container.
C)
To build and run a single Docker container.
In the next lesson, we’ll discuss some variations to what we have already learned.